/**
 * Класс, предназначенный для сериализации и десериализации объекто типа Person.
 * В качестве формата хранения выбран XML, закодированный в Base64
 */
#ifndef _PERSONSERIALIZER_H
#define	_PERSONSERIALIZER_H

#include <string>
#include "common/DateSerializer.h"
#include "common/ObjectSerializer.h"
#include "common/XmlSerializer.h"
#include "common/ParseException.h"
#include "Gender.h"
#include "Person.h"
#include "conf.h"

namespace etu {
namespace genealogy_tree {

using etu::common::DateSerializer;
using etu::common::ObjectSerializer;
using etu::common::XmlSerializer;
using etu::common::ParseException;

class PersonSerializer : public ObjectSerializer<const Person *>,
        public XmlSerializer {

public:
    PersonSerializer() {}
    PersonSerializer(const PersonSerializer& orig)
        : ObjectSerializer<const Person *>(orig), XmlSerializer(orig) {}
    virtual ~PersonSerializer() {}
    virtual std::string serialize(const Person* person);
    virtual Person* deserialize(const std::string& src) throw(ParseException);

private:

    /**
     * Десериализация пола человека из строкового представления
     * @param str строковое представление пола человека
     * @return пол человека
     */
    Gender stringToGender(const std::string& str);

    /**
     * Сериализация пола человека в строковом виде
     * @param gender пол человека
     * @return пол человека в строковом виде
     */
    std::string genderToString(const Gender& gender);
};

}
}

#endif	/* _PERSONSERIALIZER_H */

